<?php

class WucAprobacion extends TTemplateControl {
//<editor-fold defaultstate="collapsed" desc="Constantes">
  //fuente datos
  const FUENTE_DATOS_TABLA = "TABLA";
  const FUENTE_DATOS_TIPO_GENERAL = "TIPOGENERAL";

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Propiedades">
  public function getIdFlujo() {return $this->getViewState("IdFlujo");}
  public function setIdFlujo($value) {$this->setViewState("IdFlujo", $value);}

  public function getIdWorkflow() {return $this->getViewState("IdWorkflow");}
  public function setIdWorkflow($value) {$this->setViewState("IdWorkflow", $value);}

  public function getIdEmpresa() {return $this->getViewState("IdEmpresa");}
  public function setIdEmpresa($value) {$this->setViewState("IdEmpresa", $value);}

  public function getIdPaso() {return $this->getViewState("IdPaso");}
  public function setIdPaso($value) {$this->setViewState("IdPaso", $value);}

  public function getIdCache() {return $this->getViewState("IdCache");}
  public function setIdCache($value) {$this->setViewState("IdCache", $value);}

  public function getArrayCache() {return $this->getViewState("ArrayCache");}
  public function setArrayCache($value) {$this->setViewState("ArrayCache", $value);}

  public function getNombreFlujo() {return $this->getViewState("NombreFlujo");}
  public function setNombreFlujo($value) {$this->setViewState("NombreFlujo", $value);}

  public function getAprobacionActiva() {return $this->getViewState("AprobacionActiva");}
  public function setAprobacionActiva($value) {$this->setViewState("AprobacionActiva", $value);}

  public function getIdHistorial() {return $this->getViewState("IdHistorial");}
  public function setIdHistorial($value) {$this->setViewState("IdHistorial", $value);}

  public function getEsEncargado() {return $this->getViewState("EsEncargado");}
  public function setEsEncargado($value) {$this->setViewState("EsEncargado", $value);}

  public function getPaddingTop() { return $this->getViewState("PaddingTop"); }
  public function setPaddingTop($value) { $this->setViewState("PaddingTop", $value); }

  public function getPaddingBottom() { return $this->getViewState("PaddingBottom"); }
  public function setPaddingBottom($value) { $this->setViewState("PaddingBottom", $value); }

  public function getPaddingLeft() { return $this->getViewState("PaddingLeft"); }
  public function setPaddingLeft($value) { $this->setViewState("PaddingLeft", $value); }

  public function getPaddingRight() { return $this->getViewState("PaddingRight"); }
  public function setPaddingRight($value) { $this->setViewState("PaddingRight", $value); }

  public function getWidth() { return $this->getViewState("Width"); }
  public function setWidth($value) { $this->setViewState("Width", $value); }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Privados">

  protected function inicializaControles() {
    $nombrePaso = "";
    $diasAtraso = "";
    $imagenColorEstado = "";
    $valorDiferenciaEnMinutos = "0";
    $valorPlazo = "";
    $valorUnidadMedidaPlazo = "";
    $valorSemaforoAmarillo = "";
    $valorUnidadMedidaSemaforoAmarillo = "";
    $paddingBloque = "";
    $style = "";
    $width = (Utilidades::isNullOrEmpty($this->Width)) ? "" : str_replace("px", "", $this->Width);
    $oUsuarioWf = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
    $idUsuario = $oUsuarioWf->getId();

    //coloca el padding al control
    if(!Utilidades::isNullOrEmpty($this->PaddingTop)) { $paddingBloque .= "padding-top:".$this->PaddingTop; }
    if(!Utilidades::isNullOrEmpty($this->PaddingBottom)) { $paddingBloque .= "padding-bottom:".$this->PaddingBottom; }
    if(!Utilidades::isNullOrEmpty($this->PaddingLeft)) { $paddingBloque .= "padding-left:".$this->PaddingLeft; }
    if(!Utilidades::isNullOrEmpty($this->PaddingRight)) { $paddingBloque .= "padding-right:".$this->PaddingRight; }
    $style .= (!Utilidades::isNullOrEmpty($width)) ? "" : "width:".$width."px;";
    $style .= (!Utilidades::isNullOrEmpty($paddingBloque)) ? $paddingBloque : "";
    $this->pnlBloque->Style = $style;

    if ($this->getIdPaso() != "0") {
      $arr = WfPasoEstado::obtenerNombrePaso($this->getIdPaso(), $this->getIdCache(), $this->getIdFlujo());
      $totalRegistros = count($arr);

      if ($totalRegistros > 0){
        $row = $arr[0];
        $nombrePaso = $row["NombrePaso"];
        $valorDiferenciaEnMinutos = $row["DiferenciaEnMinutos"];
        $valorPlazo = $row["ValorPlazo"];
        $valorUnidadMedidaPlazo = $row["UnidadMedidaPlazo"];
        $valorSemaforoAmarillo = $row["ValorSemaforoAmarillo"];
        $valorUnidadMedidaSemaforoAmarillo = $row["UnidadMedidaSemaforoAmarillo"];
        $imgColorEstado = Utilidades::obtenerImagenColorSemaforo($valorDiferenciaEnMinutos, $valorPlazo, $valorUnidadMedidaPlazo, $valorSemaforoAmarillo, $valorUnidadMedidaSemaforoAmarillo, $diasAtraso, "Paso");
      }

      $this->lblPaso->Text = $nombrePaso;
      $this->lblDiasAtraso->Text = "<img src='" . $this->Page->Theme->BaseUrl . "/img/18/" . $imgColorEstado . "' alt='' style='vertical-align:middle'>&nbsp;&nbsp;".$diasAtraso;
      $this->pnlDiasAtraso->Visible = (Utilidades::isNullOrEmpty($diasAtraso)) ? false : true;
    }

    if(Utilidades::isNullOrEmpty($this->ArrayCache)) {
      $this->ArrayCache = WfFlujo::obtenerCache($this->getIdWorkflow(), $this->getIdCache());
    }
    $this->btnAprobar->Attributes->Add("onclick", "return(validarFormularioWucAprobacion('".$this->IdFlujo."','".$this->IdHistorial."','".$this->txtObservacion->ClientID."','".$this->pnlMensaje->ClientID."','".$this->pnlFormulario->ClientID."','Aprobar'))");
    $this->btnDevolver->Attributes->Add("onclick", "return(validarFormularioWucAprobacion('".$this->IdFlujo."','".$this->IdHistorial."','".$this->txtObservacion->ClientID."','".$this->pnlMensaje->ClientID."','".$this->pnlFormulario->ClientID."','Devolver'))");
    $this->btnRechazar->Attributes->Add("onclick", "return(validarFormularioWucAprobacion('".$this->IdFlujo."','".$this->IdHistorial."','".$this->txtObservacion->ClientID."','".$this->pnlMensaje->ClientID."','".$this->pnlFormulario->ClientID."','Rechazar'))");
    $this->btnCancelar->Attributes->Add("onclick", "return(validarFormularioWucAprobacion('".$this->IdFlujo."','".$this->IdHistorial."','".$this->txtObservacion->ClientID."','".$this->pnlMensaje->ClientID."','".$this->pnlFormulario->ClientID."','Cancelar'))");
    
    //verifica el permiso de los botones
    $esEncargado = (Utilidades::isNullOrEmpty($this->EsEncargado)) ? "0" : (($this->EsEncargado == "true" || $this->EsEncargado == "1") ? "1" : "0");

    if ($esEncargado == "1") {
      $puedeAprobar = Utilidades::verificarPermisosEncargado($this->ArrayCache, WfPermiso::APROBAR);
      $puedeDevolver = Utilidades::verificarPermisosEncargado($this->ArrayCache, WfPermiso::DEVOLVER);
      $puedeRechazar = Utilidades::verificarPermisosEncargado($this->ArrayCache, WfPermiso::RECHAZAR);
      $puedeCancelar = Utilidades::verificarPermisosEncargado($this->ArrayCache, WfPermiso::CANCELAR);
    } else {
      $puedeAprobar = true;
      $puedeDevolver = Utilidades::verificarPermisosPasos($this->ArrayCache, $this->IdPaso, WfPermiso::DEVOLVER);
      $puedeRechazar = Utilidades::verificarPermisosPasos($this->ArrayCache, $this->IdPaso, WfPermiso::RECHAZAR);
      $puedeCancelar = Utilidades::verificarPermisosPasos($this->ArrayCache, $this->IdPaso, WfPermiso::CANCELAR);
    }

    $this->hBotonAprobar->Visible = $puedeAprobar;
    $this->hBotonDevolver->Visible = $puedeDevolver;
    $this->hBotonRechazar->Visible = $puedeRechazar;
    $this->hBotonCancelar->Visible = $puedeCancelar;

    //verifica si el usuario conectado es aprobador en el paso actual
    $esAprobadorPasoActual = Utilidades::esAprobadorPasoActual($this->ArrayCache, $this->getIdPaso(), $idUsuario);
    $aprobacionActiva = $this->AprobacionActiva;
    $this->pnlFormulario->Visible = $aprobacionActiva && $esAprobadorPasoActual;
    $this->pnlNoAprobador->Visible = !$esAprobadorPasoActual;

    if($aprobacionActiva) {
      $this->pnlMensaje->Style = "display:none; padding-top:10px";
    } else {
      $this->pnlMensaje->Style = "display:block; padding-top:10px";
      $this->pnlNoAprobador->Visible = false;
    }

    //si tiene alguno de estos permisos entonces se muestra el wuc
    $this->Visible = ($puedeAprobar || $puedeDevolver || $puedeRechazar || $puedeCancelar);
  }

  /**
   * envia email a los aprobadores cuando corresponda
   * @param <type> $arrCache
   * @param <type> $idPaso
   * @param <type> $idEstado
   */
  private function enviarEmailAprobadores($arr, $idPaso, $idEstado, $idHistorial) {
    try {
      $ordenPasoProximaAccion = -1;
      $enviarMailAprobadores = false;
      $enviarMailEncargados = false;

      //obtiene el total de pasos
      $arrPasos = $arr[WfFlujo::ARRAY_PASO_LISTADO];
      $totalPasos = count($arrPasos);

      //obtiene el orden del paso
      $arrPasoActual = Utilidades::arrayRowFilter($arrPasos, "IdPaso == '".$idPaso."'");
      $ordenPaso = $arrPasoActual[0]["OrdenPaso"];

      //obtiene datos del aprobador
      $oUsuarioWf = new UsuarioWf();
      $oUsuarioWf = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
      $nombreAprobador = $oUsuarioWf->getNombreCompleto();
      $observacion = $this->txtObservacion->Text;
      $fechaActual = Utilidades::obtenerFechaHoraDDMMAAAA(true);

      switch ($idEstado) {
        case WfPasoEstado::ESTADO_APROBADO:
          if ($ordenPaso < $totalPasos) {
            $ordenPasoProximaAccion = $ordenPaso + 1;
          } else {
            $ordenPasoProximaAccion = $ordenPaso;
          }
          $idEstado = WfPasoEstado::ESTADO_PENDIENTE;
          $enviarMailAprobadores = ($ordenPaso < $totalPasos);
          break;
        case WfPasoEstado::ESTADO_DEVUELTO:
          if ($ordenPaso > 1) {
            $ordenPasoProximaAccion = $ordenPaso - 1;
          } else {
            $ordenPasoProximaAccion = $ordenPaso;
          }
          $enviarMailAprobadores = true;
          break;
        case WfPasoEstado::ESTADO_CANCELADO:
        case WfPasoEstado::ESTADO_RECHAZADO:
            $ordenPasoProximaAccion = $ordenPaso;
            $enviarMailEncargados = true;
          break;
        default:
          $ordenPasoProximaAccion = -1;
          break;
      }

      //obtiene nombre del flujo
      $strNombre = (Utilidades::isNullOrEmpty($this->NombreFlujo)) ? "" : $this->NombreFlujo;
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);

      //envia mail si corresponde al estado y si no a pasado por el ultimo paso
      if ($enviarMailAprobadores) {
        Utilidades::enviarEmailPorOrdenPaso($nombrePagina, $arr, $arrPasos, $ordenPasoProximaAccion, $this->IdWorkflow, $this->IdEmpresa, $strNombre, $idEstado, $this->IdFlujo, $this->Service, $this->Application, $this->IdCache, $idHistorial);
      }

      if ($enviarMailEncargados) {
        Utilidades::enviarEmailEncargados($nombrePagina, $arr, $arrPasos, $ordenPasoProximaAccion, $this->IdWorkflow, $this->IdEmpresa, $strNombre, $idEstado, $this->IdFlujo, $this->Service, $this->Application, $this->IdCache, $nombreAprobador, $observacion, $fechaActual, $idHistorial);
      }
    } catch (Exception $e) {
      //no hace nada
    }
  }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Publicos">
//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Eventos Controles">
  public function onLoad($param) {
    parent::onLoad($param);
    if (!$this->Page->IsPostBack) {
      $this->inicializaControles();
    }
  }

  private function cambiarEstadoAprobacion($idEstado) {
    $oUsuarioWf = new UsuarioWf();
    $oUsuarioWf = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
    $arr = WfFlujo::cambiarEstadoAprobacion($this->getIdFlujo(), $this->getIdWorkflow(), $this->getIdEmpresa(), $this->getIdPaso(), $idEstado, $oUsuarioWf->getId(), $this->txtObservacion->Text, $this->getIdCache());

    //envia mail a los aprobadores cuando corresponda
    $idHistorial = $arr[0]["Valor"];
    $this->enviarEmailAprobadores($this->ArrayCache, $this->IdPaso, $idEstado, $idHistorial);
    $this->Response->Redirect("index.php?page=Workflow.Home");
  }

  protected function btnAprobarClick($sender, $param) {
    $this->cambiarEstadoAprobacion(WfPasoEstado::ESTADO_APROBADO);
  }

  protected function btnDevolverClick($sender, $param) {
    $this->cambiarEstadoAprobacion(WfPasoEstado::ESTADO_DEVUELTO);
  }

  protected function btnRechazarClick($sender, $param) {
    $this->cambiarEstadoAprobacion(WfPasoEstado::ESTADO_RECHAZADO);
  }

  protected function btnCancelarClick($sender, $param) {
    $this->cambiarEstadoAprobacion(WfPasoEstado::ESTADO_CANCELADO);
  }

//</editor-fold>
}

?>
